bitkeeper revision 1.251 (3edde4f3E2DAGrzTEG2ZDkYKtez4fQ)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Wed, 4 Jun 2003 12:24:19 +0000 (12:24 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Wed, 4 Jun 2003 12:24:19 +0000 (12:24 +0000)
setup.c, head.S:
  Fix IOPL handling in Xenolinux.

xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/head.S
xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/setup.c

index a89fd8eda49a7f527dd2eaefcfe0c09c59ad5740..6278ececb35784ba61baa63bba55735b8b26c262 100644 (file)
@@ -50,8 +50,11 @@ startup_32:
                 
         jmp SYMBOL_NAME(start_kernel)
 
+# Stack is 8kB. We leave 100 bytes trailer for fake 'pt_regs'.
+# This is needed so that iopl checks of the saved eflags register
+# work correctly, for example.
 ENTRY(stack_start)
-       .long SYMBOL_NAME(init_task_union)+8192, __KERNEL_DS
+       .long SYMBOL_NAME(init_task_union)+8192-100, __KERNEL_DS
 
 .org 0x1000
 ENTRY(empty_zero_page)
index cc53983f34608ca0c9db30c138f21927aaca5376..21db2e8f018d61c91ff6c446748ee9ced35053c5 100644 (file)
@@ -143,6 +143,7 @@ static void __init parse_mem_cmdline (char ** cmdline_p)
 
 void __init setup_arch(char **cmdline_p)
 {
+    struct pt_regs *regs = ((struct pt_regs *)current->thread.esp0) - 1;
     unsigned long start_pfn, max_pfn, max_low_pfn;
     unsigned long bootmap_size;
     unsigned long i;
@@ -301,10 +302,15 @@ void __init setup_arch(char **cmdline_p)
 
     paging_init();
 
-    if ( start_info.flags & SIF_PRIVILEGED ) 
+    /* Set privilege level gubbins. */
+    regs->eflags &= ~(3<<12);
+    if ( start_info.flags & SIF_PRIVILEGED ) {
         /* We are privileged guest os - should have IO privileges. */
         if( HYPERVISOR_set_priv_levels(1, 1) )
             panic("Unable to obtain IOPL, despite being SIF_PRIVILEGED");
+        regs->eflags |= 1<<12;
+    }
+    current->thread.hypercall_pl = 1;
 
     if(start_info.flags & SIF_CONSOLE)
     {